﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FlorDeLiz.BusinessEntitites;
using MySql.Data.MySqlClient;
using Constants = FlorDeLiz.Utils.Constants;
using System.Data;

namespace FlorDeLiz.DataAccess
{
    public class ProdutoDA : BaseDA
    {
        #region Singleton
        private static ProdutoDA instancia;
        public static ProdutoDA Instancia
        {
            get
            {
                if (instancia == null)
                {
                    instancia = new ProdutoDA();
                }
                return instancia;
            }
        }
        #endregion

        public List<Produto> ObterProdutos(int? id, string codigo, string nome, string descricao)
        {
            List<Produto> produtos = new List<Produto>();
            try
            {
                if (Conexao.State != ConnectionState.Open)
                {
                    Conexao.Open();
                }
                CommandSql = new MySqlCommand(Constants.Procedures.SP_SELECT_PRODUTO, Conexao);

                if (id.HasValue)
                {
                    CommandSql.Parameters.Add(AdicionarParametro("P_ID_PRODUTO", MySqlDbType.Int32, 11, ParameterDirection.Input, id.Value));
                }
                else
                {
                    CommandSql.Parameters.Add(AdicionarParametro("P_ID_PRODUTO", MySqlDbType.Int32, 11, ParameterDirection.Input, DBNull.Value));
                }

                if (!string.IsNullOrEmpty(nome))
                {
                    CommandSql.Parameters.Add(AdicionarParametro("P_COD_PRODUTO", MySqlDbType.String, 20, ParameterDirection.Input, nome));
                }
                else
                {
                    CommandSql.Parameters.Add(AdicionarParametro("P_COD_PRODUTO", MySqlDbType.String, 20, ParameterDirection.Input, DBNull.Value));
                }

                if (!string.IsNullOrEmpty(codigo))
                {
                    CommandSql.Parameters.Add(AdicionarParametro("P_NM_PRODUTO", MySqlDbType.String, 100, ParameterDirection.Input, codigo));
                }
                else
                {
                    CommandSql.Parameters.Add(AdicionarParametro("P_NM_PRODUTO", MySqlDbType.String, 100, ParameterDirection.Input, DBNull.Value));
                }

                if (!string.IsNullOrEmpty(descricao))
                {
                    CommandSql.Parameters.Add(AdicionarParametro("P_DSC_PRODUTO", MySqlDbType.String, 255, ParameterDirection.Input, descricao));
                }
                else
                {
                    CommandSql.Parameters.Add(AdicionarParametro("P_DSC_PRODUTO", MySqlDbType.String, 255, ParameterDirection.Input, DBNull.Value));
                }


                CommandSql.CommandType = System.Data.CommandType.StoredProcedure;
                using (MySqlDataReader reader = CommandSql.ExecuteReader())
                {
                    produtos = PreencherProdutos(reader);
                }
            }
            catch (Exception ex)
            {
                if (Conexao.State == ConnectionState.Open)
                {
                    Conexao.Close();
                }
                throw ex;
            }
            finally
            {
                if (Conexao.State == ConnectionState.Open)
                {
                    Conexao.Close();
                }
            }
            return produtos;
        }

        public Produto AlterarProduto(Produto produto)
        {
            try
            {
                if (Conexao.State != ConnectionState.Open)
                {
                    Conexao.Open();
                }

                CommandSql = new MySqlCommand(Constants.Procedures.SP_UPDATE_PRODUTO, Conexao);

                CommandSql.Parameters.Add(AdicionarParametro("P_ID_PRODUTO", MySqlDbType.Int32, 4, ParameterDirection.Input, produto.Id));
                CommandSql.Parameters.Add(AdicionarParametro("P_COD_PRODUTO", MySqlDbType.String, 20, ParameterDirection.Input, produto.Codigo));
                CommandSql.Parameters.Add(AdicionarParametro("P_NM_PRODUTO", MySqlDbType.String, 100, ParameterDirection.Input, produto.Nome));
                CommandSql.Parameters.Add(AdicionarParametro("P_DSC_PRODUTO", MySqlDbType.String, 255, ParameterDirection.Input, produto.Descricao));
                CommandSql.Parameters.Add(AdicionarParametro("P_VLR_PRODUTO", MySqlDbType.Decimal, 10, ParameterDirection.Input, produto.Valor));
                CommandSql.Parameters.Add(AdicionarParametro("P_QTD_PRODUTO", MySqlDbType.Int32, 10, ParameterDirection.Input, produto.Quantidade));                

                CommandSql.CommandType = CommandType.StoredProcedure;

                CommandSql.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                if (Conexao.State == ConnectionState.Open)
                {
                    Conexao.Close();
                }
                throw ex;
            }
            finally
            {
                if (Conexao.State == ConnectionState.Open)
                {
                    Conexao.Close();
                }
            }

            return produto;
        }

        public Produto InserirProduto(Produto produto)
        {
            try
            {
                if (Conexao.State != ConnectionState.Open)
                {
                    Conexao.Open();
                }

                CommandSql = new MySqlCommand(Constants.Procedures.SP_INSERT_PRODUTO, Conexao);

                CommandSql.Parameters.Add(AdicionarParametro("P_COD_PRODUTO", MySqlDbType.String, 20, ParameterDirection.Input, produto.Codigo));
                CommandSql.Parameters.Add(AdicionarParametro("P_NM_PRODUTO", MySqlDbType.String, 100, ParameterDirection.Input, produto.Nome));
                CommandSql.Parameters.Add(AdicionarParametro("P_DSC_PRODUTO", MySqlDbType.String, 255, ParameterDirection.Input, produto.Descricao));
                CommandSql.Parameters.Add(AdicionarParametro("P_VLR_PRODUTO", MySqlDbType.Decimal, 10, ParameterDirection.Input, produto.Valor));
                CommandSql.Parameters.Add(AdicionarParametro("P_QTD_PRODUTO", MySqlDbType.Int32, 10, ParameterDirection.Input, produto.Quantidade));                

                CommandSql.CommandType = CommandType.StoredProcedure;
                using (MySqlDataReader reader = CommandSql.ExecuteReader())
                {
                    List<Produto> produtos = PreencherProdutos(reader);
                    if (produtos != null && produtos.Count > 0)
                    {
                        produto = produtos[0];
                    }
                }
            }
            catch (Exception ex)
            {
                if (Conexao.State == ConnectionState.Open)
                {
                    Conexao.Close();
                }
                throw ex;
            }
            finally
            {
                if (Conexao.State == ConnectionState.Open)
                {
                    Conexao.Close();
                }
            }

            return produto;
        }

        private List<Produto> PreencherProdutos(MySqlDataReader reader)
        {
            List<Produto> produtos = new List<Produto>();
            Produto produto;
            while (reader.Read())
            {
                produto = new Produto();
                produto.Id = (int)reader["ID_PRODUTO"];
                produto.Codigo = reader["COD_PRODUTO"].ToString();
                produto.Nome = reader["NM_PRODUTO"].ToString();
                produto.Descricao = reader["DSC_PRODUTO"].ToString();
                produto.Valor = (decimal)reader["VLR_PRODUTO"];
                produto.Quantidade = (int)reader["QTD_PRODUTO"];

                produtos.Add(produto);
            }

            return produtos;
        }
    }
}
